#include "Tutorial_Lighting.h"

//
#include "Modules.h"

//
#include "pcrecpp.h"
//
#pragma comment (lib, "Euclid.lib")

//
Hannover::Hannover()
:	_modules(0)
{
	_windowTitle = "Tutorial_Lighting";
}

Hannover::~Hannover()
{

}

bool Hannover::createModules()
{
	_modules = new Modules;
	
	//
	if (!_modules->create(_hwnd))
	{
		return false;
	}

	//
	std::string pattern(".*3Dfx.*");
	pcrecpp::RE re(pattern);
	if (re.FullMatch("3dfx"))
	{
		breakable;
	}

	//
	return true;
}

bool Hannover::foreRender()
{
	//
	return true;
}

bool Hannover::rendering()
{
	//
	_modules->getRenderEngine()->getRenderSystem()->beginFrame(true, true, true);

	//
	_modules->getRenderEngine()->getRenderSystem()->endFrame();

	//
	return true;
}

bool Hannover::postRender()
{
	//
	return true;
}

bool Hannover::forePlay()
{
	//
	if (!createWindow())
	{
		return false;
	}

	//
	if (!adjustClientArea())
	{
		return false;
	}

	//
	if (!createModules())
	{
		return false;
	}

	//
	if (!setViewport())
	{
		return false;
	}
	
	//
	return true;
}

bool Hannover::postPlay()
{
	//
	if (_modules)
	{
		_modules->close();
	}

	//
	return true;
}

bool Hannover::update()
{
	if (NULL == _modules)
	{
		return false;
	}

	if (!_modules->getRenderEngine()->getRenderSystem()->update())
	{
		return false;
	}

	//
	if (!Buddha::Mouse::getSingletonPtr()->update())
	{
		return false;
	}

	//
	return true;
}

bool Hannover::setViewport()
{
	//
	D3DVIEWPORT9 v;
	v.X = 0;
	v.Y = 0;
	v.Width = Buddha::WindowHelper::getSingletonPtr()->getClientWidth(_hwnd);
	v.Height = Buddha::WindowHelper::getSingletonPtr()->getClientHeight(_hwnd);
	v.MinZ = 0.0f;
	v.MaxZ = 1.0f;

	//
	if (!_modules->getRenderEngine()->getRenderSystem()->setViewport(&v))
	{
		return false;
	}

	//
	return true;
}